package nethelp

import (
	"github.com/gin-gonic/gin"
	"net"
	"strings"
)

// GetRequestIP 获取客户端ip
func GetRequestIP(ctx *gin.Context) string {
	ip := ctx.GetHeader("X-Real-IP")
	if net.ParseIP(ip) != nil {
		return ip
	}

	ip = ctx.GetHeader("X-Forward-For")
	for _, i := range strings.Split(ip, ",") {
		if net.ParseIP(i) != nil {
			return i
		}
	}

	//ip, _ = ctx.RemoteIP()
	//if net.ParseIP(ip) != nil {
	//	return ip
	//}

	//包含RemoteIP方法了
	reqIP := ctx.ClientIP()
	if reqIP == "::1" {
		reqIP = "127.0.0.1"
	}
	return reqIP
}

// HasLocalIP 检测 IP 地址是否是内网地址
// 通过直接对比ip段范围效率更高
func HasLocalIP(ip net.IP) bool {
	if ip.IsLoopback() {
		return true
	}

	ip4 := ip.To4()
	if ip4 == nil {
		return false
	}

	return ip4[0] == 10 || // 10.0.0.0/8
		(ip4[0] == 172 && ip4[1] >= 16 && ip4[1] <= 31) || // 172.16.0.0/12
		(ip4[0] == 169 && ip4[1] == 254) || // 169.254.0.0/16
		(ip4[0] == 192 && ip4[1] == 168) // 192.168.0.0/16
}

// IsLocalIp 检测 IP 地址字符串是否是内网地址
func IsLocalIp(ip string) bool {
	return HasLocalIP(net.ParseIP(ip))
}
